
/**
 * 认证控制器
 * 处理用户登录相关功能
 */

// 加载环境变量
require('dotenv').config();

// 使用bcryptjs替代bcrypt，避免编译问题
const bcrypt = require('bcryptjs');

// 导入数据库连接
const db = require('../config/db');

// 导入JWT库
const jwt = require('jsonwebtoken'); // 需要安装: npm install jsonwebtoken
/**
 * 处理用户登录请求
 * @param {Object} req - Express请求对象
 * @param {Object} res - Express响应对象
 */
const loginHandler = async (req, res) => {
  try {
    const { username, password } = req.body;

    // 检查请求体是否包含必要的字段
    if (!username || !password) {
      return res.status(400).json({
        success: false,
        message: '请提供用户名和密码'
      });
    }

    // 从数据库查找用户
    const [rows] = await db.execute('SELECT * FROM users WHERE username = ?', [username]);
    const user = rows[0];

    if (user && bcrypt.compareSync(password, user.password_hash)) {
      // 更新最后登录时间
      await db.execute(
        'UPDATE users SET last_login_at = ? WHERE id = ?', 
        [new Date(), user.id]
      );
      
      // 登录成功，返回用户信息（不包含密码哈希）
      const { password_hash: _, ...userInfo } = user;
      const token = jwt.sign(
        {
          id: user.id,
          username: user.username,
          role: user.role
        }, process.env.JWT_SECRET, 
        { expiresIn: '4h' }
      );
      res.json({
        success: true,
        message: '登录成功',
        user: {
          id: user.id,
          username: user.username,
          role: user.role,
          email: user.email,
        },
        token
      });
    } else {
      // 登录失败，用户名或密码错误
      res.status(401).json({
        success: false,
        message: '用户名或密码错误'
      });
    }
  } catch (error) {
    console.error('登录处理错误:', error);
    res.status(500).json({
      success: false,
      message: '服务器内部错误'
    });
  }
};

/**
 * 注册新用户
 * @param {Object} req - Express请求对象
 * @param {Object} res - Express响应对象
 */
const registerHandler = async (req, res) => {
  try {
    const { username, email, password, role = 'subscriber' } = req.body;

    // 检查请求体是否包含必要的字段
    if (!username || !email || !password) {
      return res.status(400).json({
        success: false,
        message: '请提供用户名、邮箱和密码'
      });
    }

    // 验证邮箱格式
    const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
    if (!emailRegex.test(email)) {
      return res.status(400).json({
        success: false,
        message: '请提供有效的邮箱地址'
      });
    }

    // 检查用户名是否已存在
    const [existingUserRows] = await db.execute('SELECT * FROM users WHERE username = ?', [username]);
    if (existingUserRows.length > 0) {
      return res.status(400).json({
        success: false,
        message: '用户名已存在'
      });
    }
    
    // 检查邮箱是否已存在
    const [existingEmailRows] = await db.execute('SELECT * FROM users WHERE email = ?', [email]);
    if (existingEmailRows.length > 0) {
      return res.status(400).json({
        success: false,
        message: '该邮箱已被注册'
      });
    }
    
    // 验证角色是否为有效值
    const validRoles = ['admin', 'editor', 'author', 'subscriber'];
    const finalRole = validRoles.includes(role) ? role : 'subscriber';
    
    // 使用bcryptjs加密密码
    const passwordHash = bcrypt.hashSync(password, 10);
    
    // 将新用户插入数据库
    await db.execute(
      `INSERT INTO users (username, email, password_hash, role, status)
       VALUES (?, ?, ?, ?, ?)`,
      [username, email, passwordHash, finalRole, 'pending']
    );

    // 返回注册成功信息
    res.status(201).json({
      success: true,
      message: '用户注册成功',
      timestamp: new Date().toISOString()
    });
  } catch (error) {
    console.error('注册处理错误:', error);
    res.status(500).json({
      success: false,
      message: '服务器内部错误'
    });
  }
};

/**
 * 检查服务器是否运行正常
 * @param {Object} req - Express请求对象
 * @param {Object} res - Express响应对象
 */
const healthCheckHandler = (req, res) => {
  res.json({
    success: true,
    message: '服务器运行正常',
    timestamp: new Date().toISOString()
  });
};

// 统一使用 CommonJS 导出
module.exports = {
  loginHandler,
  registerHandler,
  healthCheckHandler
};